package com.shiehub.sdk.opengw.util;

import com.shiehub.sdk.opengw.vo.Leaf;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

/**
 * @Description:
 * @Author: guoleijie@shie.com.cn
 * @Since: 创建时间 2016年12月11日 下午9:29:12
 */
public class DomUtils {

  /**
   * @Description: 获得Document对象
   * @param:
   * @ReturnType: Document
   * @exception:
   * @Author: guoleijie@shie.com.cn
   * @Since: 创建时间 2016年12月11日 下午10:34:43
   */
  public static Document getDocument(String xml) throws Exception {
    Document document = DocumentHelper.parseText(xml);
    return document;
  }

  /**
   * @Description: 给指定元素复制
   * @param:
   * @ReturnType: void
   * @exception:
   * @Author: guoleijie@shie.com.cn
   * @Since: 创建时间 2016年12月11日 下午11:15:10
   */
  public static void setSingleElementText(Document doc, String path, String text) {
    Element element = (Element) doc.selectSingleNode(path);
    element.setText(text);
  }

  public static String getSingleElementText(Document doc, String path) {
    Element element = (Element) doc.selectSingleNode(path);
    return element.getText();
  }

  /**
   * @Description: 获取指定节点下所有叶子节点值, 按照顺序用“|”拼接字符串
   * @param: xml 报文字符串
   * @param: specifyNodePath 指定节点路径
   * @ReturnType: String
   * @exception:
   * @Author: guoleijie@shie.com.cn
   * @Since: 创建时间 2016年12月11日 下午9:32:42
   */
  public static String getLeafString(String xml, String specifyNodePath) throws Exception {
    Document srcdoc = getDocument(xml);
    Element element = srcdoc.getRootElement();
    //获取的Body
    List elements = element.selectNodes(specifyNodePath);
    List<Leaf> leafs = new ArrayList<Leaf>();
    for (int i = 0; i < elements.size(); i++) {
      leafs.addAll(getLeafs((Element) elements.get(i)));
    }
    String leafString = getLeafString(leafs);
    return leafString;
  }

  /**
   * @Description: 获取所有叶子节点值和叶子节点路径
   * @param:
   * @ReturnType: void
   * @exception:
   * @Author: guoleijie@shie.com.cn
   * @Since: 创建时间 2016年12月11日 下午10:29:01
   */
  private static void getLeafList(Element element, List<Leaf> leafs) {
    List elements = element.elements();
    if (elements.isEmpty()) {//没有子元素
      String xpath = element.getPath();
      //System.err.println(element.getQualifiedName());
      String value = element.getText();
      leafs.add(new Leaf(xpath, value));
    } else {//有子元素
      for (Iterator it = elements.iterator(); it.hasNext(); ) {
        Element childElem = (Element) it.next();
        //递归遍历
        getLeafList(childElem, leafs);
      }
    }
  }

  /**
   * @Description: 获取所有叶子节点入口方法
   * @param:
   * @ReturnType: List<Leaf>
   * @exception:
   * @Author: guoleijie@shie.com.cn
   * @Since: 创建时间 2016年12月11日 下午10:30:44
   */
  private static List<Leaf> getLeafs(Element element) {
    List<Leaf> leafs = new ArrayList<Leaf>();
    getLeafList(element, leafs);
    return leafs;
  }

  /**
   * @Description: 将叶子节点值转化成字符串
   * @param:
   * @ReturnType: String
   * @exception:
   * @Author: guoleijie@shie.com.cn
   * @Since: 创建时间 2016年12月11日 下午10:31:44
   */
  private static String getLeafString(List<Leaf> leafs) {
    if (null == leafs || leafs.isEmpty()) {
      return null;
    }
    StringBuffer leafBuff = new StringBuffer();
    for (Leaf leaf : leafs) {
      leafBuff.append(leaf.getValue()).append("|");
    }
//		String  = "|".eqleafStringuals(leafBuff.toString())?"|":leafBuff.substring(0, leafBuff.length()-1);
    return leafBuff.toString();
  }

  /**
   * @Description: 获得doc的字符串
   * @param:
   * @ReturnType: String
   * @exception:
   * @Author: guoleijie@shie.com.cn
   * @Since: 创建时间 2016年12月11日 下午10:37:08
   */
  public String getXmlString(Document doc) {
    return doc.asXML();
  }


}
